package space

import (
	"errors"
	"src/zeus/iserver"
)

var errEntityExisted = errors.New("entityExisted")
var errEntityNoExisted = errors.New("entityNoExisted")
var errCreateEntityFail = errors.New("createTinyEntity error")

// AddTinyEntity 增加简单物件
func (s *Space) AddTinyEntity(entityType string, entityID uint64, initParam iserver.IInitParam) (interface{}, error) {

	// logger.Debug(logger.LogKey_Entity, "AddTinyEntity entityID:", entityID)
	if _, ok := s.tinyEntities[entityID]; ok {
		return nil, errEntityExisted
	}

	e := iserver.GetSrvInst().NewEntityByProtoType(entityType)
	ie, isTinyEntity := e.(iTinyEntity)
	if !isTinyEntity || ie == nil {
		return nil, errors.New("AddTinyEntity entityType NoExisted")
	}
	err := ie.onEntityCreated(entityID, entityType, s.GetRealPtr().(iserver.ISpace), initParam, ie.(ITinyEntity))
	if err != nil {
		ie.onDestroy()
		return nil, err
	}

	if ie.onInit() == false {
		ie.onDestroy()
		return nil, errors.New("AddTinyEntity onInit false")
	}
	s.tinyEntities[entityID] = ie

	return e, nil
}

// RemoveTinyEntity 删除简单物件
func (s *Space) RemoveTinyEntity(entityID uint64) error {

	var ie iTinyEntity
	if iie, ok := s.tinyEntities[entityID]; !ok {
		return errEntityNoExisted
	} else {
		ie = iie.(iTinyEntity)
	}
	ie.onDestroy()

	delete(s.tinyEntities, entityID)

	return nil
}

// GetTinyEntity 获取简单实体
func (s *Space) GetTinyEntity(entityID uint64) ITinyEntity {
	if iie, ok := s.tinyEntities[entityID]; !ok {
		return nil
	} else {
		return iie.(ITinyEntity)
	}
}

// TravsalTinyEntity 遍历简单实体
func (s *Space) TravsalTinyEntity(f func(iserver.ISpaceEntity)) {
	for _, v := range s.tinyEntities {
		f(v.(iserver.ISpaceEntity))
	}
}

// TravsalTinyEntity 遍历简单实体 带break返回
func (s *Space) TravsalTinyEntityUntil(f func(entity iserver.ISpaceEntity) bool) {
	for _, v := range s.tinyEntities {
		if !f(v.(iserver.ISpaceEntity)) {
			break
		}
	}
}

// GetSpaceEntity 获取SpaceEntity
func (s *Space) GetSpaceEntity(entityID uint64) iserver.ISpaceEntity {

	// 先找是不是玩家
	tarEntity := s.GetEntity(entityID)
	if tarEntity == nil {
		// 再找是不是tiny
		tarTinyEntity := s.GetTinyEntity(entityID)
		// 没找到就返回
		if tarTinyEntity == nil {
			return nil
		}
		return tarTinyEntity
	} else {
		return tarEntity.(iserver.ISpaceEntity)
	}
}
